package com.curricula.curriculum.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.curricula.curriculum.vo.EscolarVO;

/**
 * Clase para la el acceso a datos querys: insert, update, select y delete.
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class EscolarDAO {
	static Logger log = Logger.getLogger(EscolarDAO.class);
	
	/**
	 * Ejecucion del query con la sentencia INSERT invocada por el servicio EscolarService
	 * 
	 * @author Hugo
	 * @param AficionVO aficionVO
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean insert(EscolarVO escolaridadVO, Connection conn)throws SQLException{
		boolean insertado = false;
		int i=1;
		PreparedStatement ps=null;
		String sql = "INSERT INTO escolaridad (usr_id,esc_institucion,esc_clave,esc_nivel,esc_especialidad,esc_titulo,esc_finicio,esc_ffinal,esc_telefono,esc_direccion,esc_comentarios, esc_orden, esc_visible)"
					+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
		int rows;
		try{
			ps = conn.prepareStatement(sql);
			ps.setString(i++, String.valueOf(escolaridadVO.getIdUser()));
			ps.setString(i++, escolaridadVO.getInstitucion());
			ps.setString(i++, escolaridadVO.getClave());
			ps.setString(i++, escolaridadVO.getNivel());
			ps.setString(i++, escolaridadVO.getEspecialidad());
			ps.setString(i++, escolaridadVO.getTituloObtenido());
			ps.setString(i++, escolaridadVO.getFechaInicio());
			ps.setString(i++, escolaridadVO.getFechaFinal());
			ps.setString(i++, escolaridadVO.getTelefono());
			ps.setString(i++, escolaridadVO.getDireccion());
			ps.setString(i++, escolaridadVO.getComentario());
			ps.setString(i++, String.valueOf(escolaridadVO.getOrden()));
			ps.setBoolean(i++, true);
			
			rows = ps.executeUpdate();
			log.info("Consulta SQL: "+ sql);
			
			if(rows>0){
				log.info("Insertados "+ rows+ " escuelas correctamente");
				insertado = true;				
			}else{
				log.error("No se insertaron las escuelas");
			}			
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return insertado;		
	}
	
	/**
	 * Ejecucion del query con la sentencia DELETE invocada por el servicio EscolarService
	 * se le pasa como parametro dos enteros el id del registro a eliminar y el id
	 * del usuario del cual se quiere eliminar el registro.
	 * 
	 * @author Hugo
	 * @param int idAficion
	 * @param int idUser
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean delete(int idEscolar, int idUser, Connection conn)throws SQLException{
		boolean eliminado=false;
		PreparedStatement ps = null;
		int rows;
		String sql = "DELETE FROM escolaridad WHERE usr_id =" + idUser + " AND esc_id=" + idEscolar;
		log.info("Consulta delete: "+ sql);
		try {
			ps = conn.prepareStatement(sql);			
			rows = ps.executeUpdate();			
			
			if(rows > 0){
				log.info("Eliminados "+ rows + "registros");
				eliminado=true;
			}
			else
				log.error("No se pudieron eliminar los registros");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}			
		}
		return eliminado;
	}
	
	/**
	 * Ejecucion del query con la sentencia UPDATE invocada por el servicio EscolarService
	 * se invoca con un parametro valor que tiene el nuevo VO a actualizar y un filtro
	 * que es el que cumplira la clausula de update.
	 * 
	 * @author Hugo
	 * @param AficionVO valor
	 * @param AficionVO filtro
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean update(EscolarVO valor, EscolarVO filtro,Connection conn)throws SQLException{
		boolean actualizado = false;
		StringBuffer sql = new StringBuffer();
		int rows;
		
		sql.append("UPDATE escolaridad SET");
		sql.append(" esc_institucion ='"+valor.getInstitucion()+"'");
		sql.append(" , esc_clave = '"+valor.getClave()+"'");
		sql.append(" , esc_nivel ='"+valor.getNivel()+"'");
		sql.append(" , esc_especialidad = '"+valor.getEspecialidad()+"'");
		sql.append(" , esc_titulo ='"+ valor.getTituloObtenido()+"'");	
		sql.append(" , esc_finicio ='"+valor.getFechaInicio()+"'");
		sql.append(" , esc_ffinal ='"+valor.getFechaFinal()+"'");
		sql.append(" , esc_telefono ='"+valor.getTelefono()+"'");
		sql.append(" , esc_direccion ='"+valor.getDireccion()+"'");
		sql.append(" , esc_comentarios ='"+valor.getComentario()+"'");
		sql.append(" , esc_orden ='"+String.valueOf(valor.getOrden()+"'"));
		if(valor.getVisible().equalsIgnoreCase(""))
			sql.append(" , esc_visible =0");
		else
			sql.append(" , esc_visible =1");
		
		sql.append(" WHERE 1=1");
		
		if(filtro.getInstitucion()!= null && !filtro.getInstitucion().equalsIgnoreCase(""))
			sql.append(" AND esc_institucion ='"+valor.getInstitucion()+"'");
		if(filtro.getClave()!= null && !filtro.getClave().equalsIgnoreCase(""))
			sql.append(" AND esc_clave ='"+valor.getClave()+"'");
		if(filtro.getNivel()!= null && !filtro.getNivel().equalsIgnoreCase(""))
			sql.append(" AND esc_nivel ='"+valor.getNivel()+"'");
		if(filtro.getEspecialidad()!= null && !filtro.getEspecialidad().equalsIgnoreCase(""))
			sql.append(" AND esc_especialidad ='"+filtro.getEspecialidad()+"'");
		if(filtro.getTituloObtenido()!= null && !filtro.getTituloObtenido().equalsIgnoreCase(""))
			sql.append(" AND esc_titulo ='"+valor.getTituloObtenido()+"'");
		if(filtro.getFechaInicio()!= null && !filtro.getFechaInicio().equalsIgnoreCase(""))
			sql.append(" AND esc_finicio ='"+valor.getFechaInicio()+"'");
		if(filtro.getFechaFinal()!= null && !filtro.getFechaFinal().equalsIgnoreCase(""))
			sql.append(" AND esc_ffinal ='"+valor.getFechaFinal()+"'");
		if(filtro.getTelefono()!= null && !filtro.getTelefono().equalsIgnoreCase(""))
			sql.append(" AND esc_telefono ='"+valor.getTelefono()+"'");
		if(filtro.getDireccion()!= null && !filtro.getDireccion().equalsIgnoreCase(""))
			sql.append(" AND esc_direccion ='"+valor.getDireccion()+"'");
		if(filtro.getComentario()!= null && !filtro.getComentario().equalsIgnoreCase(""))
			sql.append(" AND esc_comentarios ='"+valor.getComentario()+"'");
		if(filtro.getOrden()>0)
			sql.append(" AND esc_orden ="+String.valueOf(filtro.getOrden()));
		if(filtro.getIdUser()>0)
			sql.append(" AND usr_id ="+ String.valueOf(filtro.getIdUser()));
		if(filtro.getId()>0)
			sql.append(" AND esc_id ="+String.valueOf(filtro.getId()));
		
		log.info("Consulta update: "+ sql);
		
		PreparedStatement ps = null;		
		try {
			ps = conn.prepareStatement(sql.toString());			
			rows = ps.executeUpdate();			
			if(rows>0){
				log.info("Actualizados "+ rows+ "registros");
				actualizado = true;
			}
			else
				log.info("No se pudieron actualizar los registros");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return actualizado;
	}
	
	/**
	 * Ejecucion del query con la sentencia SELECT invocada por el servicio EscolarService,
	 * se invoca con un Vo que servira de filtro para obtener una lista con todos los elementos
	 * que cumplan la clausula del VO filtro.
	 * 
	 * @author Hugo
	 * @param AficionVO aficion
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static List<EscolarVO> find(EscolarVO escolar, Connection conn)throws SQLException{
		List<EscolarVO> listaEscolar = new ArrayList<EscolarVO>();
		PreparedStatement ps = null;
		String sql ="SELECT * FROM escolaridad WHERE 1=1";
		
		if(escolar.getIdUser()>0)
			sql+=" AND usr_id ="+ escolar.getIdUser();
		if(escolar.getInstitucion()!= null && escolar.getInstitucion().trim().length()>0)
			 sql+=" AND esc_institucion='"+ escolar.getInstitucion()+"'";
		if(escolar.getClave()!= null && escolar.getClave().trim().length()>0)
			 sql+=" AND esc_clave='"+ escolar.getClave()+"'";
		if(escolar.getNivel()!= null && escolar.getNivel().trim().length()>0)
			 sql+=" AND esc_nivel='"+ escolar.getNivel()+"'";
		if(escolar.getEspecialidad()!= null && escolar.getEspecialidad().trim().length()>0)
			 sql+=" AND esc_especialidad='"+ escolar.getEspecialidad()+"'";
		if(escolar.getTituloObtenido()!= null && escolar.getTituloObtenido().trim().length()>0)
			 sql+=" AND esc_titulo='"+ escolar.getTituloObtenido()+"'";
		if(escolar.getFechaInicio()!= null && escolar.getFechaInicio().trim().length()>0)
			 sql+=" AND esc_finicio='"+ escolar.getFechaInicio()+"'";
		if(escolar.getFechaFinal()!= null && escolar.getFechaFinal().trim().length()>0)
			 sql+=" AND esc_ffinal='"+ escolar.getFechaFinal()+"'";
		if(escolar.getTelefono()!= null && escolar.getTelefono().trim().length()>0)
			 sql+=" AND esc_telefono='"+ escolar.getTelefono()+"'";
		if(escolar.getDireccion()!= null && escolar.getDireccion().trim().length()>0)
			 sql+=" AND esc_direccion='"+ escolar.getDireccion()+"'";
		if(escolar.getComentario()!= null && escolar.getComentario().trim().length()>0)
			 sql+=" AND esc_comentarios='"+ escolar.getComentario()+"'";
		if(escolar.getVisible()!= null && escolar.getVisible().trim().length()>0)
			 sql+=" AND esc_visible=" + true;
		if(escolar.getId()>0)
			 sql+=" AND esc_id="+ escolar.getId();
		sql+=" ORDER BY esc_orden";
				
		log.info("Consulta Find: "+ sql);
		
		try {
			ps = conn.prepareStatement(sql);			
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()){
				EscolarVO encontrado=new EscolarVO();
				encontrado.setIdUser(rs.getInt("usr_id"));
				encontrado.setId(rs.getInt("esc_id"));
		    	encontrado.setInstitucion(rs.getString("esc_institucion"));
		    	encontrado.setClave(rs.getString("esc_clave"));
		    	encontrado.setNivel(rs.getString("esc_nivel"));
		    	encontrado.setEspecialidad(rs.getString("esc_especialidad"));
		    	encontrado.setTituloObtenido(rs.getString("esc_titulo"));
		    	encontrado.setFechaInicio(rs.getString("esc_finicio"));
		    	encontrado.setFechaFinal(rs.getString("esc_ffinal"));
		    	encontrado.setTelefono(rs.getString("esc_telefono"));
		    	encontrado.setDireccion(rs.getString("esc_direccion"));
		    	encontrado.setComentario(rs.getString("esc_comentarios"));
		    	encontrado.setOrden(rs.getInt("esc_orden"));
		    	encontrado.setVisible(rs.getInt("esc_visible")==1?"checked":"");
		    	listaEscolar.add(encontrado);
			}		
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return listaEscolar;		
	}

}
